use tauri::command;
use log::{error, info};
use lettre::message::header::ContentType;
use lettre::transport::smtp::authentication::Credentials;
use lettre::{Message, SmtpTransport, Transport, Mailbox};

pub struct MailSender;
struct Sender {
    name: String,
    email: String,
    password: String,
    smtpServerPath: String,
    sendTitle: String,
}

impl MailSender {
  /**
 * 发送邮件给指定接收者。
 *
 * 此函数通过遍历接收者列表，并从消息映射中获取对应的消息，然后调用 `sendMail` 函数发送邮件。
 * 这个函数的核心作用是协调发送者和消息内容，以及具体的接收者，实现邮件的批量发送。
 *
 * 参数:
 * - `sender`: 发送邮件的实体，通过引用传递，以便在函数内部调用发送邮件的功能。
 * - `messagesMap`: 一个映射，存储了消息内容和接收者之间的对应关系。通过接收者可以从映射中获取对应的消息内容。
 * - `receivers`: 一个接收者列表，函数将遍历这个列表，并为每个接收者发送邮件。
 */
  #[command]
  fn send_mails(sender: &Sender, receivers, messagesMap) {
      // 遍历接收者列表
      for receiver in receivers {
          // 从消息映射中获取对应接收者的消息内容
          let message = messagesMap.get(&receiver);
          // 调用 sendMail 函数发送邮件
          send_mail(sender, message, &receiver);
      }
  }

    pub fn send_mail(&self, sender: &Sender, receiver: &str, subject: &str, body: &str) -> Result<(), Box<dyn Error>> {
        // 构建邮件消息对象，设置发件人、回复人、收件人、主题和正文
       let email = Message::builder()
      .from(Mailbox::new(sender.name, sender.email))
      .reply_to("Yuin <yuin@domain.tld>".parse().unwrap())
      .to("Hei <hei@domain.tld>".parse().unwrap())
      .subject(sender.sendTitle)
      .header(ContentType::TEXT_PLAIN)
      .body(String::from("Be happy!"))
      .unwrap();

      // 创建发件人的SMTP凭证
      let creds = Credentials::new("liuxiaolin@shupudit.net".to_owned(), "L1X2L3!!".to_owned());

      // 设置SMTP服务器，并建立连接
      // Open a remote connection to gmail smtphz.qiye.163.com
      let mailer = SmtpTransport::relay(sender.smtpServerPath.as_str())
          .unwrap()
          .credentials(creds)
          .build();

      // 尝试发送邮件，成功则打印成功信息，失败则抛出panic
      // Send the email
      match mailer.send(&email) {
        Ok(_) => info!("Email sent successfully!"),
        Err(e) => error!("Could not send email: {:?}", e),
      }
    }
}
